/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package anjos.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Utils {

    public static byte[] fileToByte(File file) {
        FileInputStream fis = null;

        try {

            fis = new FileInputStream(file);

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            try {
                for (int readNum; (readNum = fis.read(buf)) != -1;) {
                    bos.write(buf, 0, readNum); //no doubt here is 0
                    //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
                    System.out.println("read " + readNum + " bytes,");
                }
            } catch (IOException ex) {

                return null;
            }
            byte[] bytes = bos.toByteArray();
            fis.close();
            return bytes;
        } catch (Exception e) {
            try {
                fis.close();
            } catch (IOException ex) {
                Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
    }

    public static double arredondamento(double n) {
        BigDecimal bigDecimal = new BigDecimal(n);
        bigDecimal = bigDecimal.setScale(2, RoundingMode.HALF_UP);
        n = bigDecimal.doubleValue();

        return n;
    }
    private static final char[] FIRST_CHAR
            = (" !'#$%&'()*+\\-./0123456789:;<->?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            + "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ E ,f'.++^%S<O Z  ''''.-"
            + "-~Ts>o ZY !C#$Y|$'(a<--(_o+23'u .,1o>113?AAAAAAACEEEEIIIIDNOO"
            + "OOOXOUUUUyTsaaaaaaaceeeeiiiidnooooo/ouuuuyty").toCharArray();
    /**
     * Para a normaliza��o dos caracteres de 32 a 255, segundo caracter
     */
    private static final char[] SECOND_CHAR
            = ("  '         ,                                               "
            + "\\                                   $  r'. + o  E      ''  "
            + "  M  e     #  =  'C.<  R .-..     ..>424     E E            "
            + "   E E     hs    e e         h     e e     h ").toCharArray();

    public static String normalize(String str) {
        char[] chars = str.toCharArray();
        StringBuffer ret = new StringBuffer(chars.length * 2);
        for (int i = 0; i < chars.length; ++i) {
            char aChar = chars[i];
            if (aChar == ' ' || aChar == '\t') {
                ret.append(' '); // convertido para espa�o  
            } else if (aChar > ' ' && aChar < 256) {
                if (FIRST_CHAR[aChar - ' '] != ' ') {
                    ret.append(FIRST_CHAR[aChar - ' ']); // 1 caracter  
                }
                if (SECOND_CHAR[aChar - ' '] != ' ') {
                    ret.append(SECOND_CHAR[aChar - ' ']); // 2 caracteres  
                }
            }
        }

        return ret.toString();
    }

    public static void main(String[] args) {
        System.out.println(normalize("asdf�r�sd�d�d� ;;;;;�����"));

    }

    public static String retirarCaracteresEspeciais(String s) {

        if (s != null && !s.equals("")) {
            s = s.replace(".", "");
            s = s.replace("-", "");
            s = s.replace("/", "");
            s = s.replace(")", "");
            s = s.replace("(", "");
            s = s.replace("&", "");
            s = s.replace("�", "");
            s = s.replace("�", "");
            s = s.replace("@", "");
            s = s.trim();

            String acentuado = "���������������������������������������������������";
            String semAcento = "cCaeiouyAEIOUYaeiouAEIOUaonaeiouyAEIOUAONaeiouAEIOU";

            char[] tabela = new char[256];

            for (int i = 0; i
                    < tabela.length;
                    ++i) {
                tabela[i] = (char) i;

            }
            for (int i = 0; i
                    < acentuado.length();
                    ++i) {
                tabela[acentuado.charAt(i)] = semAcento.charAt(i);

            }

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i
                    < s.length();
                    ++i) {
                char ch = s.charAt(i);

                if (ch < 256) {
                    sb.append(tabela[ch]);

                } else {
                    sb.append(ch);
                }
            }
            return sb.toString();
        }
        return null;
    }

    public static long difDatasMilliSeg(Date date1, Date date2) {
        long differenceMilliSeconds = date2.getTime() - date1.getTime();
        if (date1.after(date2)) {
            differenceMilliSeconds = (differenceMilliSeconds * -1);

        }
        return differenceMilliSeconds;
    }

    /*
     * long differenceMilliSeconds = date2.getTime() - date1.getTime(); return
     * differenceMilliSeconds; System.out.println("diferenca em milisegundos: "
     * + differenceMilliSeconds); System.out.println("diferenca em segundos: " +
     * (differenceMilliSeconds / 1000)); System.out.println("diferenca em
     * minutos: " + (differenceMilliSeconds / 1000 / 60));
     * System.out.println("diferenca em horas: " + (differenceMilliSeconds /
     * 1000 / 60 / 60)); System.out.println("diferenca em dias: " +
     * (differenceMilliSeconds / 1000 / 60 / 60 / 24)); }
     */
    public static long difdatasHoras(Date date1, Date date2) {
        long diffhoras = (difDatasMilliSeg(date1, date2) / 1000 / 60 / 60);
        return diffhoras;
    }

    public static long difdatasSeg(Date date1, Date date2) {
        long diffhoras = (difDatasMilliSeg(date1, date2) / 1000);
        return diffhoras;
    }

    public static long difdatasMin(Date date1, Date date2) {
        long diffhoras = (difDatasMilliSeg(date1, date2) / 1000 / 60);
        return diffhoras;
    }

    public static long difdatasDias(Date date1, Date date2) {
        long diffhoras = (difDatasMilliSeg(date1, date2) / 1000 / 60 / 60 / 24);
        return diffhoras;
    }

    public static String retornaNumeros(String texto) {
        texto = texto.replaceAll("\\D*", ""); //To numeric digits only
        return texto;
    }

    public static boolean somenteNumeros(String valor) {

        boolean aprovado = false;

        try {
            Double test1 = Double.parseDouble(valor);
            aprovado = true;
        } catch (Exception e) {
        }

        if (aprovado) {
            return true;
        }

        try {
            Integer test2 = Integer.parseInt(valor);
            aprovado = true;
        } catch (Exception e) {
        }

        if (aprovado) {
            return true;
        }

        try {
            Long test3 = Long.parseLong(valor);
            aprovado = true;
        } catch (Exception e) {
        }

        if (aprovado) {
            return true;
        } else {
            return false;
        }

    }

    public static String primeiraLetraMaiuscula(String palavra) {

        if (palavra != null) {
            int len = palavra.length();
            String out = "";
            out += palavra.substring(0, 1).toUpperCase();
            out += palavra.substring(1, len);
            return out;
        }
        return palavra;
    }

    public static String tirarCaracteresEspeciais(String s) {

        if (s != null && !s.equals("")) {
            s = s.replace(".", "");
            s = s.replace("-", "");
            s = s.replace("/", "");
            s = s.replace(")", "");
            s = s.replace("(", "");
            s = s.replace("&", "");
            s = s.replace("�", "");
            s = s.replace("�", "");
            s = s.replace("@", "");
            s = s.trim();

            String acentuado = "���������������������������������������������������";
            String semAcento = "cCaeiouyAEIOUYaeiouAEIOUaonaeiouyAEIOUAONaeiouAEIOU";

            char[] tabela = new char[256];

            for (int i = 0; i
                    < tabela.length;
                    ++i) {
                tabela[i] = (char) i;

            }
            for (int i = 0; i
                    < acentuado.length();
                    ++i) {
                tabela[acentuado.charAt(i)] = semAcento.charAt(i);

            }

            StringBuffer sb = new StringBuffer();

            for (int i = 0; i
                    < s.length();
                    ++i) {
                char ch = s.charAt(i);

                if (ch < 256) {
                    sb.append(tabela[ch]);

                } else {
                    sb.append(ch);
                }
            }
            return sb.toString();
        }
        return null;
    }

    public static String Encriptar(String senha) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(senha.getBytes());
            BigInteger hash = new BigInteger(1, md.digest());
            String retornaSenha = hash.toString(16);
            return retornaSenha;
        } catch (NoSuchAlgorithmException ns) {
            ns.printStackTrace();
            return null;
        }

    }

     public static String replicar(String texto, int vezes) {
        String resultado = "";
        for (int i = 0; i < vezes; i++) {
            resultado = resultado + texto;
        }
        return resultado;
    }
     
    public static String zeroEsquerda(String valor, int quantDigito) {
        String resultado = replicar("0", quantDigito-valor.length());
        resultado = resultado + valor;
        return resultado;
    }

    public static String reaisExtenso(String valor) {
        String extenso = ""; //variavel que retornará o valor por extenso
        String tipo = ""; //variavel que definira o tipo de número ( unitario, dezena, centena)
        String parte1 = ""; //variavel que armazenará temporariamente o valor que foi analizado
        int cont = valor.length(); //conta quantos números tem o valor
        int i = 0; //variavel de controle do while
        int somar = 1; //variavel que dirá o valor a ser somado á variável "i"

        while (i < cont) {
            somar = 1;
//verifica se o caracter atual é número ou uma "," ou "."
            if (valor.substring(i, i + 1).equals(",") == false && valor.substring(i, i + 1).equals(".") == false) {
//o valor passado tem 3 dígitos, ex: R$ 1,20
                if (cont == 4 && i == 0) {
                    tipo = "unitario";
                } else if (cont == 4 && i == 2) {
                    tipo = "dezena";
                } else if (cont == 4 && i == 3) {
                    tipo = "unitario";
                } //o valor passado tem 4 dígitos, ex: R$ 11,20
                else if (cont == 5 && i == 0) {
                    tipo = "dezena";
                } else if (cont == 5 && i == 1) {
                    tipo = "unitario";
                } else if (cont == 5 && i == 3) {
                    tipo = "dezena";
                } else if (cont == 5 && i == 4) {
                    tipo = "unitario";
                } //o valor passado tem 5 dígitos, ex: R$ 111,20
                else if (cont == 6 && i == 0) {
                    tipo = "centena";
                } else if (cont == 6 && i == 1) {
                    tipo = "dezena";
                } else if (cont == 6 && i == 2) {
                    tipo = "unitario";
                } else if (cont == 6 && i == 4) {
                    tipo = "dezena";
                } else if (cont == 6 && i == 5) {
                    tipo = "unitario";
                } //o valor passado tem 6 d�gitos, ex: R$ 1.111,20
                else if (cont == 8 && i == 0) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 2) {
                    tipo = "centena";
                } else if (cont == 8 && i == 3) {
                    tipo = "dezena";
                } else if (cont == 8 && i == 4) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 6) {
                    tipo = "dezena";
                } else if (cont == 8 && i == 7) {
                    tipo = "unitario";
                } //o valor passado tem 7 dígitos, ex: R$ 11.111,20
                else if (cont == 9 && i == 0) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 1) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 3) {
                    tipo = "centena";
                } else if (cont == 9 && i == 4) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 5) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 7) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 8) {
                    tipo = "unitario";
                } //o valor passado tem 8 dígitos, ex: R$ 111.111,20
                else if (cont == 10 && i == 0) {
                    tipo = "centena";
                } else if (cont == 10 && i == 1) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 2) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 4) {
                    tipo = "centena";
                } else if (cont == 10 && i == 5) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 6) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 8) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 9) {
                    tipo = "unitario";
                }

// se o tipo analisado for do tipo unitário, define a variável "parte1"
                if (tipo.equals("unitario")) {
                    if (valor.substring(i, i + 1).equals("1")) {
                        parte1 = "Um ";
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Dois ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Tr�s ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quatro ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Cinco ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Seis ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Sete ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oito ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Nove ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }
// se o tipo analisado for do tipo dezena, define a variável "parte1"
                if (tipo.equals("dezena")) {
                    if (valor.substring(i, i + 1).equals("1")) {
//se o caracter começa com "1" é avaliado tb o caracter seguinte
                        if (valor.substring(i, i + 2).equals("10")) {
                            parte1 = "Dez ";
                        } else if (valor.substring(i, i + 2).equals("11")) {
                            parte1 = "Onze ";
                        } else if (valor.substring(i, i + 2).equals("12")) {
                            parte1 = "Doze ";
                        } else if (valor.substring(i, i + 2).equals("13")) {
                            parte1 = "Treze ";
                        } else if (valor.substring(i, i + 2).equals("14")) {
                            parte1 = "Quatorze ";
                        } else if (valor.substring(i, i + 2).equals("15")) {
                            parte1 = "Quinze ";
                        } else if (valor.substring(i, i + 2).equals("16")) {
                            parte1 = "Dezesseis ";
                        } else if (valor.substring(i, i + 2).equals("17")) {
                            parte1 = "Dezesete ";
                        } else if (valor.substring(i, i + 2).equals("18")) {
                            parte1 = "Dezoito ";
                        } else if (valor.substring(i, i + 2).equals("19")) {
                            parte1 = "Dezenove ";
                        }
                        somar = 2; //como foi analisado duas casas do valor, a variável "i" será acrescentada em 2
                    } //se o caracter não começa com "1", já é definido a variável parte1
                    else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Vinte ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Trinta ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quarenta ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Cinquenta ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Sessenta ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Setenta ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oitenta ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Noventa ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }
// se o tipo analisado for do tipo centena, define a variável "parte1"
                if (tipo.equals("centena")) {
                    if (valor.substring(i, i + 1).equals("1")) {
//se o caracter começa com "1", avalia os proximos dois caracteres, para
//definir se é "Cem" ou "Cento"
                        if (valor.substring(i, i + 3).equals("100")) {
                            parte1 = "Cem ";
                        } else {
                            parte1 = "Cento ";
                        }
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Duzentos ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Trezentos ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quatrocentos ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Quinhentos ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Seiscentos ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Setecentos ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oitocentos ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Novecentos ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }
//se o caracter é igual a "0" ou "," não é adicionado a palavra "e "
                if (i == 0 || valor.substring(i - 1, i) == ",") {
                    extenso = extenso + parte1;
                } else if (valor.substring(i, i + 1).equals("0") == false) { //se o caracter é igual á "0"
                    if (extenso.equals("")) { //verifica se a variável extenso é nula
                        extenso = extenso + parte1;
                    } else if (extenso.substring(extenso.length() - 4).equals("Mil ")) { //verifica se a variável extenso é nula
                        extenso = extenso + parte1;
                    } else {
                        extenso = extenso + "e " + parte1;
                    }
                }

            } //verifica se o caracter atual é ","
            else if (valor.substring(i, i + 1).equals(",")) {
                if (cont == 4 && Integer.parseInt(valor.substring(i - 1, i)) == 1) {
//se o valor tem 3 dégitos e começa com "1", adiciona a palavra Real
                    extenso = extenso + "Real ";
                } else if (cont > 4 || Integer.parseInt(valor.substring(i - 1, i)) > 1) {
//se o valor tem mais 3 dígitos ou não começa com "1", adiciona a palavra Reais
                    extenso = extenso + "Reais ";
                }

            } //verifica se o caracter atual é "."
            else if (valor.substring(i, i + 1).equals(".")) {
                extenso = extenso + "Mil "; //se sim, acrescenta a palavra "Mil"
            }

            i = i + somar;

        }
//verifica se as duas casas decimais é maior que 1
        if (Integer.parseInt(valor.substring(cont - 2, cont)) > 1) {
            extenso = extenso + "Centavos"; //se sim, acrescenta a palavra Centavos
        } else if (Integer.parseInt(valor.substring(cont - 2, cont)) == 1) {
            extenso = extenso + "Centavo"; //se não, acrescenta a palavra Centavo
        }

        return extenso;
    }

    public static void zeraHora(Date date) {
        Date result = new Date(date.getYear(), date.getMonth(), date.getDate(), 0, 0, 0);
        date.setTime(result.getTime());
    }

    public static void zeraDate(Date date) {
        Date result = new Date(0, 0, 0, date.getHours(), date.getMinutes(), date.getSeconds());
        date.setTime(result.getTime());
    }

    public static Date StringToDate(String ddmmaaaa) {
        if (!ddmmaaaa.isEmpty()) {
            ddmmaaaa = Utils.retornaNumeros(ddmmaaaa);
            Integer ano = Integer.parseInt(ddmmaaaa.substring(4)) - 1900;
            Integer mes = Integer.parseInt(ddmmaaaa.substring(2, 3)) - 1;
            Integer dia = Integer.parseInt(ddmmaaaa.substring(0, 1));

            return new Date(ano, mes, dia);
        }
        return null;
    }

    public static Double StringToDouble(String valor, String dec, String separador) {
        Double val = 0.0;
        if (!valor.isEmpty()) {
            Integer d = 0;
            if (dec.equalsIgnoreCase("A")) {
                if (valor.contains(separador)) {
                    d = (valor.length() - valor.indexOf(separador))-1;
                }
            } else {
                d = Integer.parseInt(dec);
            }
            Double div = Double.parseDouble("1"+Utils.replicar("0", d));
            val = Double.parseDouble(Utils.retornaNumeros(valor)) / div;
        }
        return val;
    }

    public static Double StringToDouble(String valor, String dec) {
        return StringToDouble(valor, dec, ",");
    }

    public static Double StringToDouble(String valor) {
        return StringToDouble(valor, "A", ",");
    }
}
